#ifndef OSGUniverseTool_H
#define OSGUniverseTool_H

#include <osg/Geode>
#include <osgGe/Vec3d>
#include <osg/LineWidth>
#include <osgText/Text>
#include <osg/MatrixTransform>
#include <osg/LightSource>
#include <osg/Image>
#include <osg/Geometry>
#include <osgGe/Vec3>
#include <osgGe/Vec4>
#include <osg/Billboard>
#include <osg/AutoTransform>
#include <osg/Projection>
#include <OsgExTool/Export>
namespace OsgExTool {

	//图形工具集
	class OsgExTool_EXPORT OSGUniverseTool
	{
	public:

		/**
		 * @brief createTextGeometry 根据文本内容,位置,尺寸大小,颜色生成文字
		 * @param str                内容
		 * @param pos                位置
		 * @param size               尺寸大小
		 * @param color              颜色
		 * @return                   文字
		 */
		static osg::ref_ptr<osg::Geode> create3DText(osg::Vec3 pos);

		static osg::ref_ptr<osg::AutoTransform> createTextAuto(std::string str, osg::Vec3f pos, float size = 20, osg::Vec4f color = osg::Vec4f(1.0, 0.0, 0.0, 1.0));

		static osg::ref_ptr<osgText::Text> createTextGeometry(std::string str, osg::Vec3f pos, float size = 20, osg::Vec4f color = osg::Vec4f(1.0, 0.0, 0.0, 1.0));
		static osg::ref_ptr<osg::Projection> createBillboardText(std::string text, osg::Vec3f pos, int size, osg::Vec4 color = osg::Vec4f(1.0, 0.0, 0.0, 1.0));
		/**
		 * @brief getImage  根据QImage, iconID, PNG图片所在的路径,生成Image
		 * @param path      路径
		 * @return          生成Image
		 */



		/**
		 * @brief createBilloard 一些列点生成BillBoard
		 * @param points         输入的点
		 * @param colors         billBoard的颜色
		 * @param type           billBoard的类型,比如是点,线,三角形,还是四边形
		 * @return               返回Billboard
		 */
		static osg::ref_ptr<osg::Billboard> createBilloard(std::vector<osg::Vec3f> points, std::vector<osg::Vec4d> colors, GLenum type);
		static osg::ref_ptr<osg::Billboard> createBilloard(std::vector<osg::Vec3f> points, osg::Vec4f colors, GLenum type);

		/**
		 * @brief createRect     根据中心坐标,宽和高,生成矩形Billboard,可以带纹理,也可以不带,纹理用textureID表示
		 * @param x              中心坐标x
		 * @param y              中心坐标y
		 * @param width          宽
		 * @param height         高
		 * @param color          颜色
		 * @param line_width     线宽
		 * @return
		 */
		static osg::ref_ptr<osg::Projection> createRect(double x, double y, double width, double height, osg::Vec4 color, int type = osg::PrimitiveSet::LINE_LOOP, double line_width = 3, int bin_num = 1);
		static osg::ref_ptr<osg::Projection> createRectTexture(double x, double y, double width, double height, int textureID);
		static osg::ref_ptr<osg::Geode> createBox(osg::Vec3 center, osg::Vec3f half_length, osg::Vec4 color = osg::Vec4(0.0, 0.0, 0.0, 1.0));
		static osg::ref_ptr<osg::Geometry> createSimpleBox(osg::Vec3 center, osg::Vec3f xyzLength, osg::Vec4 color);

		static osg::ref_ptr<osg::Geode> createBoxsGeode(std::vector<osg::Vec3f>& points, double width, double height = 2, osg::Vec4 color = osg::Vec4(0.5, 0.0, 0.0, 0.5));

		static osg::ref_ptr<osg::MatrixTransform> createErectArrow(osg::Vec3f f, osg::Vec3f s, double w, double h, osg::Vec4 color);

		/**
		 * @brief createGemetry 输入三维或者二维的两个点,线宽,颜色,生成带有宽度的线段,线段用四边形表示,带反走样
		 * @param v             输出一系列的坐标
		 * @param c             输出一系列点的颜色
		 * @param color         颜色
		 * @param f             第一个点
		 * @param s             第二个点
		 * @param width         宽度
		 */
		//void createGemetry(osg::ref_ptr<osg::Vec3Array> v, osg::ref_ptr<osg::Vec4Array> c, osg::Vec4f color, osg::Vec3f f, osg::Vec3f s,  double width);
		static void createGemetry_(osg::ref_ptr<osg::Vec3Array> v, osg::ref_ptr<osg::Vec4Array> c, osg::Vec4f color, osg::Vec2d f, osg::Vec2d s, double width);

		static osg::ref_ptr<osg::MatrixTransform> createMatrixNode(osg::ref_ptr<osg::Node> node, osg::Vec3f pos);
		static osg::ref_ptr<osg::Camera> createTextHUD(osg::ref_ptr<osgText::Text>& text);
	};
}

using namespace OsgExTool;
#endif


